/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package raccoon.suvisa.datos.fachadas.beans;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Logger;
import raccoon.suvisa.datos.fachadas.*;
import javax.ejb.Stateless;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import raccoon.suvisa.datos.entities.Control;
import raccoon.suvisa.datos.entities.Cuentaxentidad;
import raccoon.suvisa.datos.entities.Transaccion;
import raccoon.suvisa.datos.entities.Tarjeta;

/**
 *
 * @author Gabriel
 */
@Stateless
public class TransaccionBean implements TransaccionRemote {

    @PersistenceContext
    private EntityManager em;

    @Override
    public Transaccion getTransaccion(BigDecimal idTransaccion) {
        try {
            List lst = em.createNamedQuery("Transaccion.findByIdTransaccion").setParameter("idTransaccion", idTransaccion).getResultList();
            if (!lst.isEmpty()) {
                Transaccion t = (Transaccion) lst.get(0);
                return t;
            }
        } catch (Exception e) {
            Logger.getLogger(TransaccionBean.class.getName()).info("ERROR!!!" + e.getMessage());
        }
        return null;
    }

    @Override
    public BigDecimal guardarNuevaTransaccion(Transaccion transaccion) {
        BigInteger id = new BigInteger("0");
        try {
            List lst = em.createNamedQuery("Control.findByLlave").setParameter("llave", 'K').getResultList();
            if (!lst.isEmpty()) {
                Control con = (Control) lst.get(0);
                id = con.getIdPrestamo();
                con.setIdPrestamo(id.add(BigInteger.ONE));
                em.merge(con);
                transaccion.setIdTransaccion(new BigDecimal(id.add(BigInteger.ONE).toString()));
                transaccion.setCancelada('F');
                em.persist(transaccion);
                return transaccion.getIdTransaccion();
            }
        } catch (Exception e) {
            Logger.getLogger(TransaccionBean.class.getName()).info("ERROR!!!" + e.getMessage());
        }
        return BigDecimal.ZERO;
    }

    @Override
    public boolean actualizarTransaccion(Transaccion transaccion) {
        try {
            em.merge(transaccion);
            return true;
        } catch (Exception e) {
            Logger.getLogger(TransaccionBean.class.getName()).info("ERROR!!!" + e.getMessage());
        }
        return false;
    }

    @Override
    public List<Transaccion> getTransaccionesPorFecha(Date fecha) {
        return null;
    }

    @Override
    public List<Transaccion> getTransaccionesPorEntidad(BigDecimal idEntidad, boolean origen, boolean destino) {
        try {
            List<Transaccion> lst = new ArrayList<Transaccion>();
            List<Cuentaxentidad> list = em.createNamedQuery("Cuentaxentidad.findByIdEntidad").setParameter("idEntidad", idEntidad).getResultList();
            if (!list.isEmpty()) {
                for (int i = 0; i < list.size(); i++) {
                    lst.addAll(em.createNamedQuery("Transaccion.findByIdCuentao").setParameter("idCuentao", list.get(i).getIdCuenta()).getResultList());
                    lst.addAll(em.createNamedQuery("Transaccion.findByIdCuentad").setParameter("idCuentad", list.get(i).getIdEntidad()).getResultList());
                }
            }
            return lst;
        } catch (Exception e) {
            Logger.getLogger(TransaccionBean.class.getName()).info("ERROR!!!" + e.getMessage());
        }
        return null;
    }

    @Override
    public boolean deshacerTransaccion(BigDecimal idTransaccion) {
        try {
            List<Transaccion> lst = em.createNamedQuery("Transaccion.findByIdTransaccion").setParameter("idTransaccion", idTransaccion).getResultList();
            if (!lst.isEmpty()) {
                Transaccion t = lst.get(0);
                t.setCancelada('V');
                t.setFechacancelada(new Date());
                List<Tarjeta> ret = em.createNamedQuery("Tarjeta.findByIdCuenta").setParameter("idCuenta", t.getIdCuentao()).getResultList();
                if (!ret.isEmpty()) {
                    Tarjeta trj = ret.get(0);
                    trj.setSaldo(trj.getSaldo() + t.getMonto());
                    em.merge(trj);
                    em.merge(t);
                }
            }
            return true;
        } catch (Exception e) {
            Logger.getLogger(TransaccionBean.class.getName()).info("ERROR!!!" + e.getMessage());
        }
        return false;
    }
}
